'''
tokens[]
i=0;
stack=[开]
while(stack != [])
    if (stack[top] 是某终结符):
        if 下一个token是这个终结符:
            top=top-1;
        else:
            还原
    elif stack[top]不是终结符：
        top=top-1
        stack[top]=非终结符
        top=top+1
'''
class 栈类:
    def __init__(self,s):
        self.列=s
        self.长 = len(self.列)
    def 增(self,n):
        for c in n:
            self.列.append(c)
        self.长 = len(self.列)
    def 减(self):
        self.列.pop()
        self.长 = len(self.列)
    def 显(self):
        print(self.列)
    def 长(self):
        return self.长
        
        
stack=["开"]
tokens="组花量等数行花行"
tokens="组花量等数行量等数行花行"
tokens="组花量等数行量等数行量等数行量等数行量等数行量等数行量等数行量等数行量等数行量等数行花行"
tokensr = list(tokens[::-1])
NEXT={}
NEXT["开"]="组排"
NEXT["排"]="花班花行"
NEXT["班"]={0:"式",1:"式班"}
NEXT["式"]="量等数行"

MC=[]
MC_tmp=[]

class 下句类:
    def __init__(self):
        self.班i=0
        self.栈0=[]
        self.tokensr=[]
        self.MC=[]
    def 可能语句(self,符):
        if 符=="班":
            #if self. 班i>=len(NEXT["班"]):
            #    return False
            长=len(NEXT[符])
            出= NEXT[符][self.班i%长][::-1]
            self.班i=self.班i+1
            return 出
        else:
            return NEXT[符][::-1]
    def 存(self,栈0,tokensr,MC):
        if 栈0.列[-1]=="班":
            新栈0=栈类(s=[i for i in 栈0.列])
            self.栈0.append(新栈0)
            self.tokensr.append([i for i in tokensr])
            self.MC.append([i for i in MC])
            print("保存回溯点")
            #import pdb
            #pdb.set_trace()
            
    def 取(self):
        return self.栈0.pop(),self.tokensr.pop(),self.MC.pop()
if __name__=="__main__":
    print("语法分析:")
    ##  一些栈的测试
    栈0=栈类(s=stack)
    下句=下句类()
    # 栈0.减()
    # 栈0.增("组排")
    # 栈0.显()
    
    ## 语法分析
    果=True
    while 栈0.长>0:
        栈0.显()
        print(tokensr)
        符=栈0.列[栈0.长-1]
        # 如果出现"班",就要建立回溯点
        下句.存(栈0,tokensr,MC)
        #import pdb
        #pdb.set_trace()
        i=0
        if 符 in "开排班式":
            栈0.减()
            栈0.增(下句.可能语句(符))
        elif 符 in "花行量等数组":
            if 符==tokensr[-1]:
               栈0.减()
               #import pdb
               #pdb.set_trace()
               # 整理符合标准的字符，生成汇编代码
               c=tokensr.pop()
               if c in "量等数":
                   MC_tmp.append(c)
               if "".join(MC_tmp)=="量等数":
                   MC_tmp=[]
                   MC.append("00000000,")
            elif tokensr[-1] in "花行量等数组":
               print("回溯")
               栈0,tokensr,MC=下句.取()
               #pdb.set_trace()
            else:
               果=False
               print("源码中出现非组字符:%s"%(tokensr[-1]))
               break
            
        else:
            print("产生式中出现非组的字符:%s"%(符))
            果=False
            break
    if 果==True:
        print("语句:[%s]符合[组]的文法"%(tokens))
        print(MC)
    else:
        print("编译失败")
       
